if ($ && $.ajax) {
    window.Promise = Promise;
    $.extend({
        /** AJAX请求
            * params - requestURL: string (请求去接口路径)
            * params - config: Object (AJAX参数配置)
            * params - requestMETHOD: string (AJAX请求类型)
            * params - callback: function (请求后的回调方法)
            * return: null || Promise (异步用callback获取，否则返回Promise对象)
            */
        http: function(requestURL, config = {}, requestMETHOD = "GET", callback = function() {}) {
            let hasCallback = typeof(callback) === "function";
            requestMETHOD = requestMETHOD.toUpperCase();
            // 回调方法必须是个function
            if (hasCallback) {
                return http(requestURL, config, requestMETHOD, callback);
            } else {
                alert("回调函数错误！！")
            }
        },
        /** 如果值为false，不设置默认值直接设置false
            * params - data: Any (需要设置false的值)
            * return: Any (false || 原值)
            */
        $returnHasFalse: function(data, defaultData) {
            return data === false ? false : data || defaultData;
        },
        /** 对象转成URL参数
            * params - object: object (要转换的对象)
            * return: string (URL参数)
            */
        $o2q: function(object) {
            let result = '';
            Object.keys(object).forEach((key, index) => {
                result += `${!index ? '?' : '&'}${key}=${object[key]}`
            });
            return result;
        }
    });

    function http(requestURL, config, requestMETHOD, callback) {
        let serverURL = requestURL.indexOf('http') > -1 ? "" : "http://127.0.0.1:8080/mining";
        let ajaxConf = config.data ? config : {};
        let ajaxData = config.data ? config.data : config;
        
        // 目前的后台POST接口只接受URL传参
        if(requestMETHOD === 'POST' && !config.body && ajaxConf.processData !== false) {
            requestURL = requestURL + $.$o2q(ajaxData);
            // ajaxData = JSON.stringify(ajaxData);
            ajaxData = {};
        }
        // requestURL = requestURL.replace('/apis', 'http://localhost:8085');

        return new Promise(function(resolve, reject) {
            $.ajax({
                url: requestURL,                                // 请求路径
                type: requestMETHOD.toUpperCase(),              // 请求类型
                async: ajaxConf.async || true,                  // 是否异步
                data: ajaxData || {},                           // 请求携带数据
                dataType: 'json',                               // 服务器返回的数据类型
                timeout: ajaxConf.timeout || 7000,              // 请求超时时间
                contentType: $.$returnHasFalse(ajaxConf.contentType, "application/json;charset=utf-8"),              // 发送服务器的格式
                processData: $.$returnHasFalse(ajaxConf.processData, true),
                // crossDomain: true,
                // xhrFields:{withCredentials:true,useDefaultXhrHeader: false},
                headers: {
                    'Tenant-Id': '000000',
                    'Authorization': 'Basic c2FiZXI6c2FiZXJfc2VjcmV0',
                },
    
                success: function(data) {
                    if(data.success !== true) {
                        alert(data.msg);
                    } else {
                        callback(data);
                        resolve(data);
                    }
                },
                error: function(data) {
                    let statusText = '';
                    switch(data.status) {
                        case 404: statusText = '此请求不存在！！';break;
                        case 405: statusText = '请求的方法被禁止！！';break;
                        case 500: statusText = '服务内部错误！！';break;
                        case 502: statusText = '服务内部错误！！';break;
                        case 504: statusText = '服务内部错误！！';break;
                    }

                    if (statusText) {
                        alert(data.responseJSON ? data.responseJSON.msg : statusText);
                    }
                    callback(data);
                    reject(data);
                },
                complete: function(data, status) {
                    $.hideLoad();
                    if (status === 'timeout') {
                        alert('请求超时！！');
                    }
                },
                beforeSend: function(xhr) {
                    // xhr.setRequestHeader('Tenant-Id', '000000');
                    // xhr.setRequestHeader('Authorization', 'Basic c2FiZXI6c2FiZXJfc2VjcmV0');
                    $.showLoad('body');
                }
            });
        });
    }
}
